package com.linzm.leetcode.primary.exercises2_20230116;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * @Author zimingl
 * @Date 2023/1/19 22:05
 * @Description: 范围求和 II
 * 方法： 找最小的  return mina * minb;
 */
public class Demo10_598 {
    /**
     * 给你一个 m x n 的矩阵 M ，初始化时所有的 0 和一个操作数组 op ，其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时， M[x][y] 应该加 1。
     * 在 执行完所有操作后 ，计算并返回 矩阵中最大整数的个数 。
     * <p>
     * 输入: m = 3, n = 3，ops = [[2,2],[3,3]]
     * 输出: 4
     * 解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
     * 输入: m = 3, n = 3，ops = [[2,2],[3,3]]
     * 输出: 4
     * 解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
     * 示例 2:
     * 输入: m = 3, n = 3, ops = [[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3]]
     * 输出: 4
     */
    public static void main(String[] args) {
        int m = 3, n = 3;
        int[][] ops = {{2, 2}, {3, 1}};
//        int[][] ops = {{2,2},{3,3},{3,3},{3,3},{2,2},{3,3},{3,3},{3,3},{2,2},{3,3},{3,3},{3,3}};
        Demo10_598 demo10_598 = new Demo10_598();
        int num = demo10_598.maxCount(m, n, ops);
        System.out.println(num);
    }

    private int maxCount(int m, int n, int[][] ops) {
        if (ops.length == 0) {
            return m * n;
        }
        TreeSet<Integer> set = new TreeSet<>();
        TreeSet<Integer> set2 = new TreeSet<>();
        for (int i = 0; i < ops.length; i++) {
            set.add(ops[i][0]);
            set2.add(ops[i][1]);
        }
        return set.first() * set2.first();
    }

    private int maxCount3(int m, int n, int[][] ops) {
        if (ops.length == 0) {
            return m * n;
        }
        TreeSet<Integer> set = new TreeSet<>();
        for (int i = 0; i < ops.length; i++) {
            set.add(ops[i][0] * ops[i][1]);
        }
        return set.first();
    }

    private int maxCount2(int m, int n, int[][] ops) {
        if (ops.length == 0) {
            return m * n;
        }
        int[][] M = new int[m][n];
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < ops.length; i++) {
            list.add(ops[i]);
        }
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < M.length; j++) {
                for (int k = 0; k < M[j].length; k++) {
                    if (j < list.get(i)[0] && k < list.get(i)[1]) {
                        M[j][k]++;
                    }
                }
            }
        }
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        for (int j = 0; j < M.length; j++) {
            for (int k = 0; k < M[j].length; k++) {
                int count = treeMap.getOrDefault(M[j][k], 0) + 1;
                treeMap.put(M[j][k], count);
            }
        }
        return treeMap.lastEntry().getValue();
    }
}
